package com.pai4j.connect.messagequeue.consumer.redis;
import com.pai4j.connect.messagequeue.consumer.service.ArticlePushConsumeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

/**
 * 文章推送Redis队列监听器
 * 该类负责监听Redis中的消息队列，当有新消息发布到指定频道时，自动接收并处理这些消息
 */
@Slf4j
@Component
public class ArticlePushRedisQueueListener implements MessageListener {

    /**
     * Redis模板，用于操作Redis数据库，这里主要用于反序列化消息
     */
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 文章推送消费服务，处理接收到的消息
     */
    @Autowired
    private ArticlePushConsumeService articlePushConsumeService;

    /**
     * 当有消息发布到Redis频道时，该方法被调用
     * 它负责监听指定的Redis频道，并处理接收到的消息
     *
     * @param message 发布到频道的消息，包含频道和消息体
     * @param pattern 消息匹配的模式，本例中未使用
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
        // 反序列化消息的频道
        String channel = (String) redisTemplate.getStringSerializer().deserialize(message.getChannel());
        // 反序列化消息体（pub/sub负载是字符串）
        String messageStr = (String) redisTemplate.getStringSerializer().deserialize(message.getBody());
        // 记录接收到的消息信息
        log.info("ArticlePushRedisQueueListener.onMessage =====> channel:{} messageStr:{}", channel, messageStr);

        // 调用服务处理接收到的消息
        articlePushConsumeService.consume(messageStr);
    }
}
